home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / HardwareProjects / VideoText.lha / VideoText4.2 / source / VideoText.p < prev    next >
Encoding:
Text File  |  1995-06-29  |  14.4 KB  |  443 lines

  1. PROGRAM VideoText;
  2. FROM vt USES startup,info; {$opt q,s+,i+ }
  3. { Hauptprogramm/Ereignisverwaltung zum Projekt VideoText }
  4.  
  5. CONST version = '$VER: VideoText 4.2  (29.06.95)';
  6.  
  7. {          global  i2c_serial  sys }
  8. {         /  |   \   /        /    }
  9. { pagelist decode cct        /     }
  10. {       \    |    /         /      }
  11. {        bildschirm _______/       }
  12. {            |                     }
  13. {          datei                   }
  14. {            |                     }
  15. {           jobs                   }
  16. {          /   \                   }
  17. {      info    startup             }
  18. {                                  }
  19. {  HAUPTPROGRAMM VIDEOTEXT         }
  20.  
  21. VAR l: Long;
  22.     testing: Boolean;
  23.     roundrobin: Byte;
  24.     eingabe,inputname: Str80;
  25.     taste,ch: Char;
  26.     j,toprequest,top_pending: Integer;
  27.  
  28. PROCEDURE topscan1;
  29. { schaut, ob die TOP-Seiten 1F0/1F1 schon da sind }
  30. VAR pg1,pg2: p_onepage;
  31.     hilf: p_onepage;
  32.     i: Integer;
  33.     refresh,schluss,save_fifo: Boolean;
  34. BEGIN
  35.   pg1 := hunt_in_list($1F0,0,False);
  36.   IF (pg1<>Nil) THEN IF pg1^.pg<>$1F0 THEN pg1 := Nil;
  37.   pg2 := hunt_in_list($1F1,0,True);
  38.   IF (pg1<>Nil) AND (pg2<>Nil) THEN BEGIN
  39.     busy_pointer; topinfo(pg1,pg2); normal_pointer;
  40.     IF toprequest=1 THEN BEGIN   { gwöhnliche TOP-Text-Auswahl }
  41.       { Anzahl TOP-Seiten aus 1F0 ermitteln }
  42.       top_pending := 0; i := 840; schluss := False;
  43.       REPEAT
  44.         CASE topcode[pg1^.chars[i]] OF { Magazinnummer }
  45.           14: { Don't Care } ;
  46.           15: schluss := True;
  47.           16: { ungültige Ziffer } ;
  48.           OTHERWISE IF topcode[pg1^.chars[i+7]]=2 THEN Inc(top_pending);
  49.         END;
  50.         i := i + 8;
  51.       UNTIL (i=960) OR schluss;
  52.       IF top_pending>2 THEN BEGIN  { ggf. 1 Seite nachfordern }
  53.         save_fifo := fifo; fifo := False;
  54.         add_job('1f4',False);
  55.         fifo := save_fifo;
  56.         redraw_queue(-1);
  57.       END;
  58.     END ELSE BEGIN
  59.       { "blinde" Seitenanforderung }
  60.       busy_pointer; topgrab(pg1,pg2); normal_pointer;
  61.       mainline; Write('Blockseiten angefordert');
  62.     END;
  63.     refresh := (pg1=visblpage) OR (pg2=visblpage);
  64.     del_from_list(pg1); hilf := pg2^.next; del_from_list(pg2);
  65.     update_list(hilf,-2);
  66.     IF refresh THEN writepage(thispage,True);
  67.     toprequest := 0;
  68.   END;
  69. END;
  70.  
  71. PROCEDURE topscan2;
  72. { Sind die TOP-Seiten 1F2, 1F3, 1F4 schon da? }
  73. VAR pg: ARRAY[1..3] OF p_onepage;
  74.     i,n: Integer;
  75. BEGIN
  76.   FOR i := 1 TO 3 DO
  77.     IF top_pending>=i THEN
  78.       pg[i] := hunt_in_list($1F1+i,0,True) ELSE pg[i] := Nil;
  79.   n := 0;
  80.   FOR i := 1 TO 3 DO IF pg[i]<>Nil THEN Inc(n);
  81.   IF n=top_pending THEN BEGIN  { alle in 1F0 angekündigten Seiten da? }
  82.     sleep; topselect(pg[1],pg[2],pg[3]);
  83.     top_pending := 0;
  84.     FOR i := 1 TO 3 DO
  85.       IF pg[i]<>Nil THEN  del_from_list(pg[i]);
  86.     redraw_all; wakeup;
  87.   END;
  88. END;
  89.  
  90. PROCEDURE handle_escseq(VAR s: str80);
  91. { für die ESC-Sequenzen der Sondertasten }
  92. VAR i: integer;
  93.     len,code,ft: Integer;
  94.     pg1,pg2: p_onepage;
  95.     save_fifo: Boolean;
  96. BEGIN
  97.   mainline;
  98.   len := Length(s);
  99.   IF (s[len]='~') AND (s[1] IN ['0'..'9']) THEN BEGIN    { *** F-Tasten }
  100.     code := Ord(s[1])-48;
  101.     IF len>2 THEN code := 10*code + Ord(s[2])-48;
  102.     Inc(code); { Sorry, ich verlier sonst den Überblick }
  103.     CASE code OF
  104.     1: TV_display(0); { F1: Fernsehdarstellung ganz aus }
  105.     11: TV_display(2); { Shift-F1: Vollbild }
  106.     2: BEGIN   { F2: Decoder-Reset }
  107.         init_CCT; Write('Decoder-Reset ausgef}hrt'); redraw_queue(-1);
  108.       END;
  109.     4: BEGIN  { F4: Dateiformat }
  110.         asciifile := NOT asciifile; fileinfo;
  111.       END;
  112.     5: BEGIN { F5: app/ovwr }
  113.         overwrite := NOT overwrite; fileinfo;
  114.       END;
  115.     15: BEGIN { Shift-F5: mit/ohne Icon }
  116.         withicon := NOT withicon; fileinfo;
  117.       END;
  118.     6,16: BEGIN  { F6/Shift-F6: TOP-Text Kram }
  119.         Write('TOP-Seiten angefordert'); top_pending := 0;
  120.         save_fifo := fifo; fifo := False;
  121.         IF code=16 THEN BEGIN
  122.           add_job('1f3',False); add_job('1f2',False); toprequest := 1;
  123.         END ELSE
  124.           toprequest := 2;
  125.         add_job('1f1',False); add_job('1f0/*',False);
  126.         fifo := save_fifo;
  127.         redraw_queue(-1);
  128.       END;
  129.     7: BEGIN { F7: alle Jobs löschen }
  130.         queued := 0;
  131.         FOR i := 0 TO maxactive-1 DO BEGIN
  132.           activejobs[i].pg := 0;
  133.           sperren(i);
  134.         END;
  135.         thisjob := 0;
  136.         redraw_queue(-1);
  137.       END;
  138.     17: BEGIN { Shift-F7: alle Seiten löschen }
  139.         sleep; Write('Alle Seiten wegwerfen? ');
  140.         IF ja_nein THEN BEGIN
  141.           kill_list; thispage := Nil;
  142.           writepage(Nil,True); redraw_list;
  143.         END;
  144.         wakeup;
  145.       END;
  146.     8: IF queued>0 THEN BEGIN { F8: LIFO/FIFO-Umschaltung }
  147.         fifo := NOT fifo; redraw_queue(-1);
  148.       END;
  149.     9,19: BEGIN { (Shift-)F9: VT.config/VT2.config editieren }
  150.         mainline; Write('Editor-Aufruf ... ');
  151.         busy_pointer; edconfig(code DIV 10 + 1);
  152.         normal_pointer;
  153.       END;
  154.     10,20: BEGIN { (Shift-)F10: VT.config/VT2.config lesen }
  155.         busy_pointer; getconfig(code DIV 10);
  156.         normal_pointer;
  157.       END;
  158.     OTHERWISE Write('f}r Anleitung '#155'2mHELP'#155'0m dr}cken!');
  159.     END;
  160.   END; { Ende F-Tasten }
  161.   IF (s='?~') THEN create_help;  { Help }
  162.   { *** Cursor: Listen durchblättern }
  163.   IF s[1] IN ['A'..'D','S','T'] THEN
  164.     IF jobcursor THEN BEGIN    { Warteschlange blättern }
  165.       mark_queue(False);
  166.       CASE s[1] OF
  167.         'A': Inc(thisjob);
  168.         'B': Dec(thisjob);
  169.         'C': thisjob := -queued;
  170.         'D': thisjob := maxactive-1;
  171.         'S': thisjob := thisjob - 5;
  172.         'T': thisjob := thisjob + 5;
  173.         OTHERWISE;
  174.       END;
  175.       IF thisjob<-queued THEN thisjob := -queued;
  176.       IF thisjob>=maxactive-1 THEN thisjob := maxactive-1;
  177.       mark_queue(True);
  178.       IF thisjob>=0 THEN BEGIN
  179.         aktspeicher := thisjob; display_select(aktspeicher); END;
  180.     END ELSE BEGIN      { Seitenliste blättern }
  181.       mark_list(False);
  182.       IF thispage<>Nil THEN CASE s[1] OF
  183.         'A': IF (thispage^.prev<>Nil) THEN
  184.             thispage := thispage^.prev;
  185.         'B': IF (thispage^.next<>Nil) THEN
  186.             thispage := thispage^.next;
  187.         'C': FOR i := 1 TO colht DO
  188.           IF (thispage^.next<>Nil) THEN
  189.             thispage := thispage^.next;
  190.         'D': FOR i := 1 TO colht DO
  191.           IF (thispage^.prev<>Nil) THEN
  192.             thispage := thispage^.prev;
  193.         'S': thispage := next_magazine(thispage);
  194.         'T': thispage := prev_magazine(thispage);
  195.         OTHERWISE;
  196.       END;
  197.       mark_list(True);
  198.       writepage(thispage,True);
  199.     END;
  200. END;
  201.  
  202. PROCEDURE handle_key(key: Char);
  203. { der Übersichtlichkeit halber aus dem Hauptprogramm herausgezogen }
  204. VAR j,ft: Integer;
  205.     s: Str80;
  206.     l: Long;
  207.     ok: Boolean;
  208. BEGIN
  209.   mainline;
  210.   CASE key OF
  211.     '0'..'9','/','*','.','!': IF Length(eingabe) < 8 THEN
  212.         eingabe := eingabe + key;
  213.     #8: IF Length(eingabe) > 0 THEN
  214.         eingabe[Length(eingabe)] := #0;
  215.     #13: BEGIN
  216.         add_job(eingabe,True);
  217.         redraw_queue(-1);
  218.         eingabe := '';
  219.       END;
  220.     #9: BEGIN  { Tab: Cursor zwischen Jobliste und Seitenliste umschalten }
  221.         jobcursor := NOT jobcursor;
  222.         mark_queue(jobcursor); mark_list(NOT jobcursor);
  223.       END;
  224.     #127: IF jobcursor THEN BEGIN  { Del: Job löschen }
  225.         IF thisjob>=0 THEN BEGIN
  226.           activejobs[thisjob].pg := 0;
  227.           sperren(thisjob);
  228.           redraw_queue(thisjob);
  229.         END;
  230.         IF (thisjob<0) AND (-thisjob<=queued) THEN BEGIN
  231.           FOR j := -thisjob TO queued-1 DO
  232.             queue[(firstinq+j-2) MOD qlen + 1] :=
  233.               queue[(firstinq+j-1) MOD qlen + 1];
  234.           Dec(queued);
  235.           IF thisjob<0 THEN Inc(thisjob);
  236.           redraw_queue(-1);
  237.         END;
  238.       END ELSE IF thispage<>Nil THEN BEGIN  { bzw. eine Seite löschen }
  239.           del_from_list(thispage);
  240.           update_list(thispage,-1);
  241.           writepage(thispage,True);
  242.         END;
  243.     'x': BEGIN
  244.         sleep;
  245.         Write('Wirklich aufh|ren? ');
  246.         IF ja_nein THEN stop := True;
  247.         wakeup;
  248.       END;
  249.     't': BEGIN
  250.         testing := not testing;
  251.         IF NOT testing THEN test(False);
  252.       END;
  253.     'T': IF testing THEN BEGIN
  254.         sleep; { Uhrzeit umstellen kann 'Zeit kosten' }
  255.         gettime(aktspeicher,s); force_time(s);
  256.         wakeup; Write('Systemzeit von VT }bernommen');
  257.       END;
  258.     'l': BEGIN
  259.         sleep; IF fileselect('VT-Seiten laden',False,inputname) THEN
  260.           IF filetype(inputname)=1 THEN BEGIN
  261.             busy_pointer; Write(getpages(inputname)); normal_pointer;
  262.             Write(' Seiten gelesen'); redraw_list; writepage(thispage,True);
  263.           END ELSE
  264.             Write('keine VT-Seitendatei, sorry');
  265.         wakeup;
  266.       END;
  267.     's','S',#19: BEGIN
  268.         sleep; { save_action enthält meist Rückfragen }
  269.         j := Pos(key,'sS'#19);
  270.         IF save_action(thispage,j)<>0 THEN; { nicht gespeichert :-( }
  271.         wakeup;
  272.       END;
  273.     'i': BEGIN   { IFF-Bild }
  274.         sleep;
  275.         IF fileselect('IFF-Bild speichern',True,iffpicname) THEN BEGIN
  276.           IF filetype(iffpicname)<>-1 THEN BEGIN
  277.             j := Length(iffpicname) - 17;
  278.             Write('"'); IF j>1 THEN BEGIN
  279.               Write('...',Copy(iffpicname,j,16));
  280.             END ELSE
  281.               Write(iffpicname);
  282.             Write('" }berschreiben'); ok := ja_nein;
  283.           END ELSE
  284.             ok := True;
  285.           IF ok THEN BEGIN
  286.             l := colperm;  colperm := $01234567;
  287.             s := colperms; colperms := '01234567';
  288.             REPEAT writepage(visblpage,concealed); UNTIL stop OR NOT incomplete;
  289.             mainline; Write('IFF-Bild ... '); busy_pointer;
  290.             IF iffdump THEN Write('gespeichert')
  291.               ELSE Write(#155'2mDateifehler!');
  292.             normal_pointer;
  293.             colperm := l; colperms := s; writepage(visblpage,concealed);
  294.           END;
  295.         END;
  296.         wakeup;
  297.       END;
  298.     'P': IF thispage<>Nil THEN BEGIN
  299.         sleep; busy_pointer;
  300.         Write('Seite wird gedruckt ... ');
  301.         IF printpage(thispage) THEN Write('OK.')
  302.         ELSE Write(#155'2mFehler!');
  303.         normal_pointer; wakeup;
  304.       END;
  305.     'n': BEGIN { Sendernamen anzeigen }
  306.         IF activejobs[0].pg=0 THEN BEGIN
  307.           anfordern(0,100,0,%000);
  308.           j := 50; REPEAT Delay(1); Dec(j) UNTIL seite_da(0) or (j=0);
  309.         END;
  310.         gethead(0,s);
  311.         IF activejobs[0].pg=0 THEN sperren(0);
  312.         Write('Sender: '#155'2m',s);
  313.       END;
  314.     'N': BEGIN
  315.         sleep;
  316.         IF fileselect('Ausgabedatei festlegen',True,outputname) THEN;
  317.         fileinfo;
  318.         wakeup;
  319.       END;
  320.     ' ': writepage(thispage,True);
  321.     '?': writepage(thispage,False);
  322.     '#': IF root<>Nil THEN BEGIN
  323.           busy_pointer; dump_numbers; normal_pointer;
  324.           Write('Seitennummern als Clip gespeichert');
  325.         END;
  326.     #155: BEGIN { Sondertasten auswerten }
  327.         s := '';
  328.         REPEAT  ch := readkey; s := s + ch;  UNTIL ch >= '@';
  329.         handle_escseq(s);
  330.       END;
  331.     OTHERWISE Write('f}r Anleitung '#155'2mHELP'#155'0m dr}cken!');
  332.   END;
  333. END;
  334.  
  335. PROCEDURE handle_click;
  336. { angeklickte Seitennummern aufsuchen/anfordern }
  337. VAR nr: Integer;
  338.     pg: p_onepage;
  339.     code: Char;
  340. BEGIN
  341.   mouseclicked := False;
  342.   nr := number_from_page(clickedx,clickedy);
  343.   IF nr>=0 THEN BEGIN   { Nummer in einer Seite angeklickt }
  344.     pg := hunt_in_list(nr,0,False);
  345.     IF pg<>Nil THEN IF pg^.pg<>nr THEN pg := Nil;
  346.     IF (pg<>Nil) AND (pg<>thispage) THEN BEGIN  { Seite nur anspringen }
  347.       mark_queue(False); jobcursor := False;
  348.       mark_list(False); thispage := pg; mark_list(True);
  349.       writepage(thispage,True);
  350.     END ELSE IF nr IN [$100..$899] THEN BEGIN    { Seite (neu) anfordern }
  351.       add_job(IntStr(bcd(nr)),False); redraw_queue(-1);
  352.     END;
  353.     Exit;
  354.   END;
  355.   pg := page_from_list(clickedx,clickedy);
  356.   IF pg<>Nil THEN BEGIN
  357.     mark_queue(False); jobcursor := False;
  358.     mark_list(False); thispage := pg; mark_list(True);
  359.     writepage(thispage,True);
  360.     Exit;
  361.   END;
  362.   nr := pos_from_queue(clickedx,clickedy);
  363.   IF nr<maxactive THEN BEGIN
  364.     mark_list(False); jobcursor := True;
  365.     mark_queue(False); thisjob := nr; mark_queue(True);
  366.     Exit;
  367.   END;
  368.   code := click_action(clickedx,clickedy);
  369.   CASE code OF
  370.     'T': BEGIN
  371.         testing := NOT testing;
  372.         IF NOT testing THEN test(False);
  373.       END;
  374.     'J': IF queued>0 THEN BEGIN
  375.         fifo := NOT fifo; redraw_queue(-1);
  376.       END;
  377.     'S': IF (queued=0) AND (active=0) THEN BEGIN
  378.         add_job('100/*',True); redraw_queue(-1);
  379.       END;
  380.     'D': BEGIN
  381.         sleep; IF fileselect('Ausgabedatei festlegen',True,outputname) THEN;
  382.         fileinfo; wakeup;
  383.       END;
  384.     'F': BEGIN  asciifile := NOT asciifile; fileinfo;  END;
  385.     'M': BEGIN  overwrite := NOT overwrite; fileinfo;  END;
  386.     'I': BEGIN  withicon  := NOT withicon;  fileinfo;  END;
  387.     '+','-': IF thispage<>Nil THEN BEGIN
  388.         mark_queue(False); jobcursor := False; mark_list(False);
  389.         IF (code='-') AND (thispage^.prev<>Nil) THEN
  390.           thispage := thispage^.prev;
  391.         IF (code='+') AND (thispage^.next<>Nil) THEN
  392.           thispage := thispage^.next;
  393.         mark_list(True);
  394.         writepage(thispage,True);
  395.       END;
  396.     OTHERWISE;
  397.   END;
  398. END;
  399.  
  400. BEGIN  { Hauptprogramm }
  401.   { Eine Menge Variablen werden bereits in den Units, wo sie auch deklariert }
  402.   { sind, initialisiert. }
  403.   get_args; inputname := outputname;
  404.   colperm := $13675402; colperms := '13675402';
  405.   AddExitServer(sysclean); sysinit(version);
  406.   paraminfo; say_hello(version); thispage := root; { zwei Info-Seiten erzeugen }
  407.   init_CCT; { SAA 5246 initialisieren }
  408.   active := 0; FOR j := 0 TO maxactive-1 DO activejobs[j].pg := 0;
  409.   roundrobin := 0; testing := False; stop := False;
  410.   toprequest := 0; top_pending := 0;
  411.   lastkey := #0;  eingabe := '';
  412.   cursoroff;
  413.   redraw_all;
  414.   REPEAT
  415.     space_in_queue; IF queued<qlen THEN Write(eingabe,#155'7m '#155'0m ');
  416.     IF lastkey=#0 THEN  taste := readkey
  417.     ELSE BEGIN  taste := lastkey; lastkey := #0;  END;
  418.     IF taste<>#0 THEN
  419.       handle_key(taste)
  420.     ELSE BEGIN
  421.       Delay(5);  { Multitasking-freundlich! }
  422.       IF incomplete THEN writepage(thispage,True);
  423.       IF toprequest>0 THEN topscan1;
  424.       IF top_pending>0 THEN topscan2;
  425.       IF testing THEN test(True);
  426.       IF queued>0 THEN handle_queue;
  427.       IF active>0 THEN BEGIN
  428.         handle_jobs;
  429.         attempt_input(roundrobin);
  430.         roundrobin := (roundrobin+1) MOD maxactive;
  431.       END;
  432.       IF NOT testing AND (toprequest+top_pending=0) AND (queued+active=0)
  433.         AND (lastkey=#0) AND NOT stop THEN  { nichts mehr zu tun :-) }
  434.         l := Wait(-1);
  435.     END;
  436.     intui_events;
  437.     IF mouseclicked THEN handle_click;
  438.   UNTIL stop;
  439.   SetStdIO(Nil); CloseConsole(Con);
  440.   kill_list; sysclean;
  441. END.
  442.  
  443.